package br.com.rglariguet.rgportal.controller;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.rglariguet.rgportal.Cliente;
import br.com.rglariguet.rgportal.PermissaoAcesso;
import br.com.rglariguet.rgportal.Usuario;
import br.com.rglariguet.rgportal.dao.PermissaoDAO;
import br.com.rglariguet.rgportal.dao.UsuarioDAO;

@Controller
@RequestMapping("/admin/usuarios")

public class UsuarioController {
	
	@Autowired
	private PermissaoDAO permissaoDAO;
	
	@Autowired
	private UsuarioDAO usuarioDAO;
	
	
	@RequestMapping(value="/salvar",  method = RequestMethod.POST)
	public String salvar(@Valid Usuario usuario, BindingResult br, ModelMap model){
		if (br.hasErrors()) {
			prepararTelaUsuario(model);
			return "/admin/usuarios/novoUsuario";
		}
		prepararUsuarioParaSerPersistido(usuario);
		
		usuarioDAO.salvar(usuario);
		return "redirect:/admin/usuarios/listar";
	}

	private void prepararUsuarioParaSerPersistido(Usuario usuario) {
		PermissaoAcesso permissao = permissaoDAO.buscarPorId(Long.valueOf(usuario.getPermissao()));
		List<PermissaoAcesso> permissoes = new ArrayList<PermissaoAcesso>();
		permissoes.add(permissao);
		usuario.setPermissoes(permissoes);
	}
	
	@RequestMapping("/listar")
	public String listarClientes(ModelMap model, Cliente cliente){
		List<Usuario> usuarios = usuarioDAO.listarTodos();
		model.addAttribute("usuarios", usuarios);
		return "admin/usuarios/listaUsuarios";
	}
	
	
	@RequestMapping("/novo")
	public String novoUsuario(ModelMap model, String usuario){
		prepararTelaUsuario(model);
		return "/admin/usuarios/novoUsuario";
	}

	@RequestMapping(value="/alterar",  method = RequestMethod.POST)
	public ModelAndView alterar(Usuario usuario){
		prepararUsuarioParaSerPersistido(usuario);
		usuarioDAO.alterar(usuario);
		ModelAndView mv = new ModelAndView("redirect:/admin/usuarios/listar");
		return mv;
	}
	
	@RequestMapping(value="/editar/{id}",  method = RequestMethod.GET)
	public String editar(@PathVariable Long id, ModelMap model){
		Usuario usuario = usuarioDAO.buscarPorId(id);
		prepararTelaUsuario(model, usuario);
		return "/admin/usuarios/editarUsuario";
	}
	
	@RequestMapping(value="/excluir/{id}", method=RequestMethod.GET)	
	public String excluir(@PathVariable Long id) {
		Usuario usuario = usuarioDAO.buscarPorId(id);
		usuarioDAO.excluir(usuario);
		return "redirect:/admin/usuarios/listar";
	}
	

	private void prepararTelaUsuario(ModelMap model, Usuario usuario) {
		preparaUsuarioGeral(model);
		model.addAttribute("usuario", usuario);
	}

	private void preparaUsuarioGeral(ModelMap model) {
		List<PermissaoAcesso> permissoes = permissaoDAO.listarPermissoes();		
		model.addAttribute("permissoesList", preencherComboPermissoes(permissoes));
		model.addAttribute("permissao", new PermissaoAcesso());
	}
	
	private void prepararTelaUsuario(ModelMap model) {
		preparaUsuarioGeral(model);
		model.addAttribute("usuario", new Usuario());
	}
	
	protected Map<String, String> preencherComboPermissoes(List<PermissaoAcesso> permissoes) {
		Map<String,String> permissoesMap = new LinkedHashMap<String,String>();
		for (PermissaoAcesso permissao : permissoes) {
			permissoesMap.put(permissao.getId().toString(), permissao.getGrupo());
		}
		return permissoesMap;
	}
}
